PARTE I – Cuidados antes de começar a rodar os códigos no R
Pensar quais orientações são mais gerais e quais são importantes de acompanhar cada código.
Rstudio/Pacotes/versões/sistemas operacionais
Sobre os pacotes, seria bom ter uma listinha de ‘library’ no início de cada código? Talvez com uma breve explicação do que cada pacote faz, versão mínima… não sei.
OBS: essa tabela é uma referência para obtermos as versões dos pacotes ao final do desenvolvimento do script. Ela está automatizada, então quando terminarmos ele precisamos refaze-lo de forma que não gere mais mudança nas versões (tem que fazer a tabela na mão mesmo…).
# gerar informações sobre os pacotes carregadosinfo <-sessionInfo()# gerar tabela com os pacotes e versõestibble::tribble(~Pacotes, ~Versão, version$language, version$version.string, info$otherPkgs$dplyr$Package, info$otherPkgs$dplyr$Version, info$otherPkgs$Distance$Package, info$otherPkgs$Distance$Version, info$otherPkgs$DT$Package, info$otherPkgs$DT$Version, info$otherPkgs$flextable$Package, info$otherPkgs$flextable$Version, info$otherPkgs$ggplot2$Package, info$otherPkgs$ggplot2$Version, info$otherPkgs$plotly$Package, info$otherPkgs$plotly$Version, info$otherPkgs$readr$Package, info$otherPkgs$readr$Version, info$otherPkgs$readxl$Package, info$otherPkgs$readxl$Version, info$otherPkgs$tibble$Package, info$otherPkgs$tibble$Version, info$otherPkgs$tidyr$Package, info$otherPkgs$tidyr$Version) |>qflextable() |>set_caption("Tabela xx - configuração de pacotes necessários e respectivas versões mínimas que devem ser utilizadas para reproduzir os códigos" )
Pacotes
Versão
R
R version 4.2.3 (2023-03-15)
dplyr
1.1.1
Distance
1.0.7
DT
0.27
flextable
0.9.1
ggplot2
3.4.2
plotly
4.10.1
readr
2.1.4
readxl
1.4.2
tibble
3.2.1
tidyr
1.3.0
Cuidados com a planilha .xlsx que será importada (para que mantenha o padrão da planilha de referência do ICMBio)
Algumas funções foram escritas para funcionar tomando como base de dados de referência a planilha em formato excel Planilha Oficial consolidada de Masto-aves 2014-21 Validada CEMAVE CPB CENAP.xlsx disponibilizada pelo Projeto Monitora. Estas funções carregam os dados e fazem uma série de transformações para devolve-los no formato padronizado do programa DISTANCE para Windows. Portanto, para garantir a reprodutibilidade dos códigos produzidos em versões atualizadas da base de dados do Monitora, é importante tomar alguns cuidados.
O primeiro e mais importante cuidado é manter os mesmos nomes das colunas em versões atualizadas da base de dados do Monitora. As primeiras funções, além de carregar os dados, aplicam uma série de transformações. Os nomes das colunas são alterados, e a essas são atribuídos tipos (data, caracter, fator , inteiro e numérico), linhas são eliminadas e novas colunas são gereadas. Para exemplificar, veja o código abaixo. Ele foi escrito para executar as primeiras transformações nos dados e constitui o corpo da função carregar_dados_filtrados().
# carregar a base de dados do Monitoradados_brutos <-carregar_dados_brutos_xlsx()# gerar o data.frame desejadodados_completos <- dados_brutos |># selecionar as colunas necessárias para as analises, padronizando os nomes para o formato DISTANCE dplyr::select(uc_code = CDUC,uc_name =`Local - Nome da Unidade de Conservação`,ea_number =`Número da Estação Amostral`,ea_name =`Nome da EA`,season =`Estação do ano`,sampling_day =`data da amostragem`,day_effort =`Esforço de amostragem tamanho da trilha (m)`,sp =`Espécies validadas para análise do ICMBio`,distance =`distância (m) do animal em relação a trilha`,group_size =`n° de animais`,observadores =`nome dos observadores` ) |># atribuir os tipos corretos às colunas e criar novas colunas dplyr::mutate(uc_category = stringi::stri_extract_first_words( uc_name ),# abrevia o nome das UCsuc_name_abv = forcats::lvls_revalue( uc_name,new_levels =c("ETM", "EM", "EN", "ESGT", "FJ", "PCV", "PA", "PSBoc", "PSBod", "PSC","PSM", "PSC", "PSD", "PSP", "PSO", "PPN", "PCO", "PI", "PJaú", "PJur","PMR", "PS", "PV", "PCA", "PMT", "RG", "RJ", "RTap", "RU", "RG","RTrom", "RAT", "RBA", "RCI", "RCM", "RRC", "RROP", "RIA", "RRA", "RTA" ) ),# atribuir o tipo data à coluna sampling_dayyear = lubridate::year( sampling_day ),# atribuir o tipo fator às colunas do tipo caracteracross(where( is.character ), as.factor ),# substituir separadores de nome por ","novo = stringr::str_replace_all( observadores, " e ",", " ),# substituir separadores de nome por ","novo = stringr::str_replace_all( novo, " E ",", " ),# substituir separadores de nome por ","novo = stringr::str_replace_all( novo, "/",", " ),# substituir separadores de nome por ","novo = stringr::str_replace_all( novo, ";",", " ),# substituir separadores de nome por ","novo = stringr::str_replace_all( novo, " a ",", " ) ) |># transformar os nomes dos observadores da coluna novo em colunas individuaistidyr::separate_wider_delim( novo, ",",names =c("obs1", "obs2", "obs3", "obs4", "obs5", "obs6" ),too_few ="align_start") |># gerar uma nova coluna number_observers com o número total de observadores em um mesmo transecto dplyr::mutate(# se o valor da observação é diferente de NA, substituir por 1, se for NA, substituir por 0obs1 =ifelse(!is.na(obs1), 1, 0),obs2 =ifelse(!is.na(obs2), 1, 0),obs3 =ifelse(!is.na(obs3), 1, 0),obs4 =ifelse(!is.na(obs4), 1, 0),obs5 =ifelse(!is.na(obs5), 1, 0),obs6 =ifelse(!is.na(obs6), 1, 0),# gera nova coluna number_observers a partir da soma das colunas de observadores individuaisnumber_observers = obs1 + obs2 + obs3 + obs4 + obs5 + obs6 ) |># agrupar os dados pelas colunas ea_name e sampling_daygroup_by( ea_name, sampling_day ) |># aninhar as observações agrupadas uem listasnest() |># completar com o valor correto as linhas vazias das da variável day_effortmutate(day_effort2 = purrr::map( data, \(.x) rep( .x$day_effort[!is.na( .x$day_effort ) ][1] ) ) ) |># desanihar os dadosunnest(c( data, day_effort2 ) ) |># desagrupar os dadosungroup() |># selecionar as colunas desejadas e excluir as indesejadasselect( tidyselect::starts_with(c("uc", "ea")), season, year, sampling_day,day_effort = day_effort2, sp:number_observers,-day_effort,-tidyselect::starts_with("obs") ) |># filtrar os dados pela UC e espécie desejadas dplyr::filter( uc_name =="Resex Tapajós-Arapiuns", sp =="Dasyprocta croconota" ) |>relocate( uc_category,.before = uc_name ) |>relocate( uc_name_abv,.after = uc_name )dados_completos
# gerar tabela dinâmica dos dados completosdados_completos |>slice(1:1000 ) |>datatable(filter =list(position ="top" ) )
O trecho do código que vai da linha 101 a 113 serve selecionar apenas as colunas de interesse presente nos dados originais. Note que os nomes das planilhas originais constam nesse trecho. Caso o nome de qualque uma dessas colunas seja alterado a função deixará de funcionar.
Outro aspecto importante é a presença de observações não preenchidas (ex. células vazias) nos dados originais. A função foi desenha para resolver alguns problemas presentes nos dados originais. Por exemplo, nas o trecho do código das linhas xx a xx as observações vazias (NAs) são substituidas pelo valor correto na coluna day_effort. Essa correção continnuará sendo realizada em versões atualizadas dos dados do Monitora. Porém, se outras colunas além das que estão sendo corrigidas possuirem observações vazias os dados serão carregados e transformados, porém outras funções podem ter o seu funcionamento comprometido. Por exemplo… (funções de visualização e do pacote distance que podem naõ funcionar devido a ausência de observação)
Dentre todas as funções de carregamento de dados, apenas carregar_dados_brutos() carrega a base de dados originais do Monitora, diretamente do diretório data-raw/monitora_masto_aves_2023_04_04.xlsx. Ao mesmo tempo que carrega e transforma os dados, essa função gera uma versão em um formato mais leve, .rds, no diretório data-raw (data-raw/monitora_masto_aves_2023_04_04.rds). A função seguinte no fluxo de trabalho carrega a base a partir dessa versão mais leve. Logo, sempre que houver atualizações no arquivo original de dados brutos é necessário iniciar a rotina de carregamento de dados necessariamente com a função carregar_dados_brutos().
Outros cuidados…
Imaginando que a planilha de dados do monitora é algo dinâmico, que o nome das colunas pode ser editado…
Como abrir os arquivos: como salvar e descompactar a pasta. Abrir projeto
Um passo a passo de como salvar arquivo com os códigos e abrir.. Por exemplo, da forma como está é interessante descompactar a pasta e acessar os arquivos abrindo o projeto. Acho que isso pode mudar, dependendo de como viermos a entregar o produto final. Então podemos pensar nessa explicação no final.
Cuidados com diretório
Se a gente ainda precisar ter algum tipo de preocupação quanto a isso. Acho que não. Explicar a estrtura de diretórios do projeto.
Como rodar cada tipo de arquivo (markdown, shiny)
Não é trivial para quem não está acostumado… usar runApp, knit… até mesmo o shift+enter para rodar as linhas de comando uma a uma
PARTE II – Carregando os dados para o R
Dados brutos
Não precisa se assustar com a infnidade de códigos no exemplo acima. Serviu apenas para ilustrar que construir essas funções facilita a execução e a reprodutibilidade das análise dos dados do Monitora. Para cada tarefa existe uma função cujo funcionamento não necessita de preenchimento dos argumentos (embora seja possível fornece-los). Por traz das cortinas, as funções executam as tarafas necessárias para se obter o resultado desejado. Por exemplo, o mesmo resultado pode ser obtido utilizando apenas duas funções: carregar_dados_brutos_xlsx()e gerar_tabdin_dados_brutos().
# carregar dados brutosdados_brutos <-carregar_dados_brutos_xlsx()dados_brutos
# A tibble: 27,887 × 30
CDUC Local - Nome da Unidade de Conser…¹ Número da Estação Am…² `Nome da EA`
<dbl> <chr> <dbl> <chr>
1 47 Esec da Terra do Meio 1 Trilha da F…
2 47 Esec da Terra do Meio 1 Trilha da F…
3 47 Esec da Terra do Meio 1 Trilha da F…
4 47 Esec da Terra do Meio 1 Trilha da F…
5 47 Esec da Terra do Meio 1 Trilha da F…
6 47 Esec da Terra do Meio 1 Trilha da F…
7 47 Esec da Terra do Meio 1 Trilha da F…
8 47 Esec da Terra do Meio 1 Trilha da F…
9 47 Esec da Terra do Meio 1 Trilha da F…
10 47 Esec da Terra do Meio 1 Trilha da F…
# ℹ 27,877 more rows
# ℹ abbreviated names: ¹`Local - Nome da Unidade de Conservação`,
# ²`Número da Estação Amostral`
# ℹ 26 more variables: `Esforço de amostragem tamanho da trilha (m)` <dbl>,
# `data da amostragem` <dttm>, Ano <dbl>, `Estação do ano` <chr>,
# `horário de início (h:mm)` <dttm>, `horário de término (h:mm)` <dttm>,
# `Tempo de censo` <dttm>, `velocidade (km/h)` <dbl>, …
gerar_tabdin_dados_brutos()
A função gerar_tabdin_dados_brutos(), por configuração, gera uma tabela dinâmica com 1000 linhas. Você pode controlar o número de linhas pelo argumento n_linhas =. Mas atenção! Ela não funcionará com um número superior a 4.500 linhas. Ao mudar a entrada de dados usando o argumento dados =, certifique-se de que seu número de linhas não exceda esse limite (ex. 4.500). INSERIR NOTA (após testar em máquinas diferentes) Esse valor pode varia de acordo com as configurações da sua máquina.
gerar_tabdin_dados_brutos(n_linhas =1:4500)
Dados completos
todas espécies/UCs – carrega_dados_1.Rmd Descrever o que os dados trazem e porque foram formatados dessa forma.
# carregar dados para o Rdados_completos <-carregar_dados_completos() dados_completos
# gerar tabela dinamica dos dados completosgerar_tabdin_dados_completos()
Dados filtrados
por espécie/UC – carrega_dados_2.Rmd até o momento usado com o exemplo da cutia na Resex Tapajós-Arapiuns Descrever o que os dados trazem e porque foram formatados dessa forma.
# carregar dados para o Rdados_filtrados <-carregar_dados_filtrados()dados_filtrados
# gerar tabela dinamica dos dados no formato do distance do Rgerar_tabdin_dados_distanceR_completo()
Em princípio tudo certo até aqui.
# transformar os dados para o formato do Distancedados_distance_r_covariaveis <-transformar_para_distanceR_covariaveis()dados_distance_r_covariaveis
# A tibble: 27,887 × 9
Region.Label Area Sample.Label Effort distance year size cense_time object
<fct> <dbl> <date> <dbl> <dbl> <dbl> <dbl> <drtn> <int>
1 Trilha da F… 0 2014-10-22 4650 0 2014 2 280 mins 1
2 Trilha da F… 0 2014-10-22 4650 13.4 2014 2 280 mins 2
3 Trilha da F… 0 2014-10-22 4650 3.75 2014 1 280 mins 3
4 Trilha da F… 0 2014-10-22 4650 13.5 2014 4 280 mins 4
5 Trilha da F… 0 2014-10-22 4650 7.75 2014 1 280 mins 5
6 Trilha da F… 0 2014-10-22 4650 1.7 2014 1 280 mins 6
7 Trilha da F… 0 2014-10-22 4650 8.78 2014 1 280 mins 7
8 Trilha da F… 0 2014-10-22 4650 0 2014 2 280 mins 8
9 Trilha da F… 0 2014-10-22 4650 2.5 2014 1 280 mins 9
10 Trilha da F… 0 2014-10-22 4650 7.82 2014 1 280 mins 10
# ℹ 27,877 more rows
# tabdin de dados_distanceR_covariaveisgerar_tabdin_dados_distanceR_completo_cov()
PARTE IV – Explorando e selecionando os dados para as análises
Selecionando os melhores modelos de estudo de acordo com os dados
Critŕios:
espécies com maior volume de dados total
maior volume de dados por UC – exploração_01.nb.html (acho que o .Rmd para gerar esse html não está na pasta Monitora). Eu tinha gostado bastante desse documento, com as tabelas dinâmicas. Talvez dê para selecionar as perguntas que são válidas de deixar/ tirar/ incluir. WWF - Projeto Monitora
espécies validadas
…
Exploração e seleção de dados
Aspectos relacionados ao número total de observações
Sistematizar os critérios utilizados para eliminar observações (linhas).
Pensar num esquema de árvore de decisão para se chegar ao subconjunto de dados que será analisados.
Quantas observações foram validadas para quais níveis taxonômicos?
Essas operações são realizadas sobre a tabela de dados dados_completos pois os dados que foram transformados para o formato do distace no R não possuem a coluna validation, necessária para essas opereações. Mais a frente o procedimento de como obter os dados selecionados e transformatos para o formato das análises será demonstrado.
# contar observações validadas ao nível de espécien_obs_validadas <-contar_n_obs_validadas()n_obs_validadas
[1] 20790 318 6550 14 215
Foram selecionadas apenas as observações validadas ao nível de espécie, somando um total 20790 observações.
# gerar gráfico com número observações validadas para cada nível taxonômicoplotar_n_obs_validadas()
Filnalmente chegamos ao subconjunto dos dados que será utilizado para selecionar quais espécies serão analisadas.
# gerar tabela de dados selecionadosdados_selecionados <-carregar_dados_selecionados()dados_selecionados
# contar número total de UC's n_ucs <-contar_n_uc()n_ucs
[1] 40
Os dados são provenientes de 40 unidades de conservação ao todo.
Quantas espécies ao todo?
n_sp <-contar_n_sp()n_sp
[1] 209
Até aqui temos dados para 209 espécies.
Quantas observações por unidade de conservação ao todo?
As UC’s foram filtradas de acordo com o número de observações permitir a visualização.
A função de contagem de UC’s gerou 40 UC’s, mas só há observações para 38. Lembrar de verificar isso.
# contar número de observações por UCn_obs_uc <-contar_n_obs_uc()n_obs_uc
# A tibble: 38 × 3
uc_name uc_name_abv n
<fct> <fct> <int>
1 Esec da Terra do Meio ETM 983
2 Esec Maracá EM 389
3 Esec Niquiá EN 69
4 Esec Serra Geral do Tocantins ESGT 5
5 Flona do Jamari FJ 686
6 Parna da Amazônia PA 535
7 Parna da Serra da Bocaina PSBoc 32
8 Parna da Serra da Bodoquena PSBod 102
9 Parna da Serra da Cutia PSC 475
10 Parna da Serra da Mocidade PSM 140
# ℹ 28 more rows
Adicionar o nome completo da UC na caixa interativa do gráfico. Identificar os plotes com subtítulos ex tentar adicionar título aos plotesAdicionar nomes das UCs nos 3 primeiros gáficos (descompartilhar eixo x)
# plotar o número de observações por UCplotar_n_obs_uc_interativo()
# gerar tabdingerar_tabdin_n_obs_uc()
Quantas observações para cada espécie?
Número de observações por espécie.
# contar total spn_obs_sp <-contar_n_obs_sp()n_obs_sp